/*
 * @Author: 小魏
 * @Date: 2019-09-19 09:31:49
 * @LastEditors  : 小魏
 * @LastEditTime : 2020-01-16 17:22:11
 * @Description: 图片转换方法
 */
class DisposeImage {

  /**
   * 处理网络图片转换为本地图片
   * @param {object} obj
   * @returns
   * @memberof LocalityImage
   */
  imageConversionLocal(obj) {
    let list = this._objChangeArray(obj)
    return this.setImage(list)
  }

  // 处理图片转换的方法
  setImage(list) {
    return new Promise((resolve, reject) => {
      this._setImage({ list }, res => {
        res.state === false ? reject(`第${res.i}个转换失败`) : resolve(res)
      })
    })
  }

  /**
   * 网络图片转换为本地图片
   * @param {object} obj
   * @returns
   * @memberof DisposeImage
   */
  base64ImageConversionLocal(obj) {
    // 获取文件系统管理器
    const FileSystem = wx.getFileSystemManager()
    // 循环处理base64转换本地图片
    for (let key in obj) {
      // 设置图片名字及路径
      let imageData = this._setBase64Scr(key, obj[key])
      // 将图片写入到小程序系统目录中
      FileSystem.writeFileSync(imageData.src, imageData.base64, "base64")
      // 将生成路径赋值到原来base64对象参数
      obj[key] = imageData.src
    }
    return obj
  }
  // 私有方法_设置图片名字及路径
  _setBase64Scr(name, val) {
    // wx.env.USER_DATA_PATH 小程序全局变量系统文件跟路径
    let src = `${wx.env.USER_DATA_PATH}/${name}-${this._randomCoding()}.png`
    // 格式化base64
    let base64 = val.replace(/^data:image\/\w+;base64,/, "")
    return {src, base64}
  }

  /**
   * 私有方法_处理图片转换
   * 获取网络图片信息 转换为 本地图片
   * @param {*} data
   * @param {*} cb
   * @memberof LocalityImage
   */
  _setImage(data, cb) {
    let i = data.i ? data.i : 0,
      success = data.success ? data.success : 0,
      fail = data.fail ? data.fail : 0;
    wx.getImageInfo({
      src: data.list[i].url,
      success: (res) => {
        console.log(res.path)
        success++;
        // 保存图片的宽高
        data.list[i].url = res.path
        data.list[i].height = res.height
        data.list[i].width = res.width
        i++
        if (i == data.list.length) {
          //当图片完时，停止调用
          return typeof cb == "function" && cb(this._arrayChangeObj(data.list));
        } else { //若图片还没有传完，则继续调用函数
          data.i = i
          data.success = success
          data.fail = fail
          this._setImage(data, cb)
        }
      },
      fail: (res) => {
        fail++;
        return typeof cb == "function" && cb({
          state: false,
          i: i + 1
        })
      }
    })
  }

  // 对象转换为数组
  _objChangeArray(obj) {
    let list = []
    for (let key in obj) {
      list.push({
        url: obj[key],
        name: key
      })
    }
    return list
  }

  // 数组转换对象
  _arrayChangeObj(array) {
    let obj = {}
    for (let i of array) {
      obj[i.name] = {
        url: i.url,
        width: i.width,
        height: i.height
      }
    }
    return obj
  }

  _randomCoding(mum = 4) {
    var result = [];
    let n = mum;//这个值可以改变的，对应的生成多少个字母，根据自己需求所改
    for (var i = 0; i < n; i++) {
      //生成一个0到25的数字
      var ranNum = Math.ceil(Math.random() * 25);
      //大写字母'A'的ASCII是65,A~Z的ASCII码就是65 + 0~25;
      //然后调用String.fromCharCode()传入ASCII值返回相应的字符并push进数组里
      result.push(String.fromCharCode(65 + ranNum));
    }
    return result.join('');
  }

}

export default DisposeImage
